package br.ucb.cesbdao.model.impl;

import java.sql.SQLException;
import java.util.ArrayList;

import lombok.Getter;
import lombok.Setter;

import org.apache.log4j.Logger;

import br.ucb.cesbdao.beans.Pessoa;
import br.ucb.cesbdao.enuns.EnumMensagens;
import br.ucb.cesbdao.model.PessoaModel;
import br.ucb.cesbdao.persistencia.dao.PessoaDAO;
import br.ucb.cesbdao.persistencia.factory.FactoryConnection;
import br.ucb.cesbdao.persistencia.factory.FactoryDAO;
import br.ucb.cesbdao.servicos.Servicos;
import br.ucb.cesbdao.visao.Visao;

public class PessoaModelImpl implements PessoaModel{
	
	private Logger logger = Servicos.carregaLog(PessoaModelImpl.class);
	@Getter @Setter
	private PessoaDAO dao;
	
	public PessoaModelImpl() {
	}
	
	@Override
	public int addPessoa(Pessoa pessoa) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().addPessoa(pessoa);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return 0;
	}

	@Override
	public ArrayList<Pessoa> listaPessoa() {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().listaPessoa();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Pessoa> consultaPessoaByTipo(String tipo) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaPessoaByTipo(tipo);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Pessoa> consultaPessoaAtiva() {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaPessoaAtiva();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Pessoa> consultaPessoaByNome(String nome) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaPessoaByNome(nome);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Pessoa> consultaPessoaByNomeTipo(String nome, String tipo) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaPessoaByNomeTipo(nome, tipo);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public Pessoa consultaPessoaByCpf(String cpf) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaPessoaByCpf(cpf);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public Pessoa consultaPessoaById(int id) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaPessoaById(id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public int alteraStatusPessoa(char status, int id) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().alteraStatusPessoa(status, id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return 0;
	}

	@Override
	public boolean deletaPessoa(int id) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().deletaPessoa(id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return false;
	}

	@Override
	public int alteraPessoa(Pessoa pessoa) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().alteraPessoa(pessoa);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return 0;
	}

	@Override
	public boolean alteraPessoaNomeSexo(Pessoa pessoa, int id) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().alteraPessoaNomeSexo(pessoa, id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return false;
	}

	@Override
	public ArrayList<Pessoa> consultaPessoaBySexoNome(String nome, String sexo) {
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaPessoaBySexoNome(nome, sexo);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}
	
	@Override
	public void desativaPessoa(Integer id) {
		try {
			Pessoa pessoa = consultaPessoaById(id);
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			if(pessoa.getStatus()=='A'){
				if (Visao.showYesNo(EnumMensagens.MSG_Q_CONFIRMACAO_INATIVAR_ATENDIDO.getMensagem(), "Atenção")){
					getDao().alteraStatusPessoa('I', id);
					Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_ATIVAR_ATENDIDO.getMensagem(), "Atenção");        				
				}
				return;
			}else{
				Visao.showMessage(EnumMensagens.MSG_ALERTA_PESSOA_INATIVO.getMensagem(),"Atenção");
			}
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
	}
	
	@Override
	public int apresentaCodigoUnico() {
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		try {
			setDao(FactoryDAO.getDaoPessoa(FactoryConnection.getInstance().criaConexao()));
			pessoas = getDao().listaPessoa();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		int maiorCodigo = 0;
		for (Pessoa pessoa : pessoas) {
			if(pessoa.getId() > maiorCodigo){
				maiorCodigo = pessoa.getId();	
			}
		}
		return maiorCodigo;
	}

	public ArrayList<Pessoa> separaPessoasAtivas(ArrayList<Pessoa> pessoas, ArrayList<Pessoa> pessoasAtivas){
		for(Pessoa pessoa : pessoas)
			if(pessoa.getStatus() == 'A')
				pessoasAtivas.add(pessoa);
		return pessoasAtivas;
	}
}
